package com.mashibing.dp.cor;

import java.util.ArrayList;
import java.util.List;

/**
 * 责任链 Chain Of Responsibility
 * 1.需求：发信息要把 <、> 过滤
 * 2.写一起的问题：
 *      a. 实际的要处理的内容多
 *      b. 可扩展性不好
 */
public class Main {
    public static void main(String[] args) {
        Msg msg = new Msg();
        msg.setMsg("大家好:)，<script>，欢迎访问 mashibing.com ，大家都是996 ");
        // 责任链的前期演变过程 ： 一个一个过滤下去
        // System.out.println("====不是责任链，只是推演==========================");
        List<Filter> filters = new ArrayList<>();
        filters.add(new HTMLFilter());
        filters.add(new SensitiveFilter());
        filters.add(new FaceFilter());
        for (Filter f:filters){
            f.doFilter(msg);
        }
        System.out.println(msg);
        System.out.println("====责任链1==========================");
        msg.setMsg("大家好:)，<script>，欢迎访问 mashibing.com ，大家都是996 ");
        FilterChain fc0 = new FilterChain();
        fc0.add(new HTMLFilter());
        fc0.add(new SensitiveFilter());
        fc0.doFilter(msg);
        System.out.println(msg);
        System.out.println("====责任链2==========================");
        msg.setMsg("大家好:)，<script>，欢迎访问 mashibing.com ，大家都是996 ");
        FilterChain fc = new FilterChain();
        fc.add(new HTMLFilter())
                .add(new SensitiveFilter());// 链条 1：SensitiveFilter执行方法时return 了false，后面的Filter不再执行
        FilterChain fc2 = new FilterChain();
        fc2.add(new FaceFilter()).add(new URLFilter());// 链条 2
        fc.add(fc2);//加上链条2
        fc.doFilter(msg);
        System.out.println(msg);
    }
}

class Msg {
    String name;
    String msg;

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    @Override
    public String toString() {
        return "Msg{" +
                "msg='" + msg + '\'' +
                '}';
    }
}

// 1、过滤器接口
interface Filter {
    //void doFilter(Msg m);
    boolean doFilter(Msg m);//返回true就往下执行，否则停止
}
// 过滤器1：过滤特殊字符
class HTMLFilter implements Filter {
    @Override
    public boolean doFilter(Msg m) {
        String r = m.getMsg();
        r = r.replace('<', '[');// 把 < 过滤成 [
        r = r.replace('>', ']');
        m.setMsg(r);
        return true;
    }
}
// 过滤器2：过滤敏感词
class SensitiveFilter implements Filter {
    @Override
    public boolean doFilter(Msg m) {
        String r = m.getMsg();
        r = r.replaceAll("996", "955");
        m.setMsg(r);
        return false;// 这个过滤完了，剩下的就不过滤了
    }
}
// 过滤器3：过滤表情
class FaceFilter implements Filter {
    @Override
    public boolean doFilter(Msg m) {
        String r = m.getMsg();
        r = r.replace(":)", "^V^");
        m.setMsg(r);
        return true;
    }
}
// 过滤器4：过滤
class URLFilter implements Filter {
    @Override
    public boolean doFilter(Msg m) {
        String r = m.getMsg();
        r = r.replace("mashibing.com", "http://www.mashibing.com");
        m.setMsg(r);
        return true;
    }
}
// 过滤器链条，继承Filter：可以把两个链条连起来：把这个整体的链条看成一个filter
class FilterChain implements Filter {
    private List<Filter> filters = new ArrayList<>();

    // 加返回类 FilterChain ，可以实现链式编程
    public FilterChain add(Filter f) {
        filters.add(f);
        return this;
    }

    public boolean doFilter(Msg m) {
        // 链条上的一环返回false就不往下过滤了
        for(Filter f : filters) {
            //f.doFilter(m);
            if(!f.doFilter(m)) return false;
        }
        return true;
    }
}